from random import randint

from rest_framework import status
from rest_framework.generics import GenericAPIView
from rest_framework.response import Response
from rest_framework.views import APIView
from libs.captcha.captcha import captcha
from django_redis import get_redis_connection
from django.http import HttpResponse


from .constants import IMAGE_CODE_EXPIRE_TIME

# 生成短信验证码
"""
访问方式： GET /verifications/smscodes/(?P<mobile>1[345789]\d{9})/?text=xxxx & image_code_id=xxxx


前端发送　uuid,手机号,手动输入的图片验证码
到后端，后端生成短信验证码，然后发送短信
    # 1　接收参数
    # 2　使用序列化器校验参数（判断该图片验证码是否过期,如果没有过期,
    # 　　则判断用户输入的验证码和ｒｅｉｄｓ中存放是否一样）
    # 3 生成短信验证码
    # 4 发送段形
    # 5 返回响应
"""
from .serializers import RegisterSMSCodeSerializer
from libs.yuntongxun.sms import CCP


class RegisterSMSCodeView(GenericAPIView):
    def get(self, request, mobile):
        # 1.接收参数
        params = request.query_params
        # 2.校验参数 -- 序列化器
        # text = params.get('text')
        # image_code_id = params.get('image_code_id')
        # if not all([text,image_code_id]):
        #     pass
        #
        # pass
        serializer = RegisterSMSCodeSerializer(data=params)

        serializer.is_valid(raise_exception=True)
        # 判断该用户是否频繁获取
        # 连接ｒｅｎｄｉｓ
        redis_conn = get_redis_connection('code')
        if redis_conn.get("sms_flag_%s" % mobile):
            return Response(status=status.HTTP_429_TOO_MANY_REQUESTS)
        # 3 生成短信验证码
        sms_code = "%06d" % randint(0, 99999)
        print(sms_code)
        redis_conn = get_redis_connection('code')
        redis_conn.setex('sms_%s'%mobile,300,sms_code)
        # 4 发送段形
        # ccp = CCP()
        # ccp.send_template_sms(mobile, [sms_code, 5], 1)
        from celery_tasks.sms.tasks import send_sms_code
        send_sms_code.delay(mobile,sms_code)

        # 5 返回响应
        return Response({"message": "OK"})


# 生成图片验证码
class RegisterImageCodeView(APIView):
    """
    生成验证码
    GET verifications/imagecodes/(?P<image_code_id>.+)/
    需要通过JS生成一个唯一码,以确保后台对图片进行校验
    """

    def get(self, request, image_code_id):
        """
        通过第三方库,生成图片和验证码,我们需要对验证码进行redis保存

        思路为:
        创建图片和验证码
        通过redis进行保存验证码,需要在设置中添加 验证码数据库选项
        将图片返回
        """
        # 创建图片和验证码
        image_name, text, image = captcha.generate_captcha()
        print(text)
        print(image_code_id)
        # 通过redis进行保存验证码
        redis_conn = get_redis_connection('code')
        redis_conn.setex('img_%s' % image_code_id, IMAGE_CODE_EXPIRE_TIME, text)
        # 将图片返回
        # 注意,图片是二进制,我们通过HttpResponse返回
        return HttpResponse(image, content_type='image/jpeg')



